# 设定模块名称
set(TARGET ${PROJECT_NAME})

# 注：这里要注意查找的先后顺序，很重要的，哪个库先查找，哪个库的xx_DIR就先设置了
# 网络工具库
#find_package(PcapPlusPlus CONFIG REQUIRED)

## openssl加密算法库
## 设置OPENSSL的根目录
#if (NOT DEFINED OPENSSL_ROOT_DIR)
#    set(OPENSSL_ROOT_DIR /usr/local/lib64)
#endif ()
## 从根目录寻找cmake配置文件
#find_package(OpenSSL CONFIG REQUIRED)
## 使用OPEN_SSL的静态库
#if (OpenSSL_FOUND)
#    set(OPENSSL_USE_STATIC_LIBS TRUE)
#endif ()

# 多线程库
find_package(Threads REQUIRED)
# duckDB数据库
find_package(DuckDB CONFIG REQUIRED)
# Boost库
find_package(Boost CONFIG REQUIRED
    COMPONENTS
        format
        circular_buffer
        lockfree
        json
        asio
        url
)
# yaml文件操作库 (/usr/local/share/cmake)
find_package(yaml-cpp CONFIG REQUIRED)
# cpu信息获取库
find_package(cpuid CONFIG REQUIRED)
# ssh2协议远程连接库
#find_package(libssh2 CONFIG REQUIRED)
# ssh2协议远程连接库
#find_package(libtelnet REQUIRED)
# redis连接库
find_package(hiredis CONFIG REQUIRED)
# bson处理库
find_package(bson CONFIG REQUIRED)
# mongodb连接库
find_package(mongoc CONFIG REQUIRED)
# http(s)网络请求
find_package(httplib REQUIRED)

## openssl加密算法库
## 设置OPENSSL的根目录
#if (NOT DEFINED OPENSSL_ROOT_DIR)
#    set(OPENSSL_ROOT_DIR /usr/local/lib64)
#endif ()
## 从根目录寻找cmake配置文件
#find_package(OpenSSL 3.5.1 EXACT CONFIG REQUIRED)
## 使用OPEN_SSL的静态库
#if (OpenSSL_FOUND)
#    set(OPENSSL_USE_STATIC_LIBS TRUE)
#endif ()

# 根据构建类型，定义预编译宏
if (CMAKE_BUILD_TYPE STREQUAL Debug)
    # 向编译器添加预定义宏。它会在编译过程中将指定的宏定义添加到源代码中。
    # 作用范围：当前 CMakeLists.txt 目录及其子目录的所有目标
    add_compile_definitions(
            TWE_DEBUG
    )
elseif (CMAKE_BUILD_TYPE STREQUAL Release)
    # 向编译器添加预定义宏。它会在编译过程中将指定的宏定义添加到源代码中。
    # 作用范围：当前 CMakeLists.txt 目录及其子目录的所有目标
    add_compile_definitions(
            TWE_RELEASE
    )
endif ()

# 工具模块
add_subdirectory(utils)
# 日志模块
add_subdirectory(logger)
# 系统配置模块(加载、保存系统相关配置)
add_subdirectory(sys_config)
# 业务云平台rpc
add_subdirectory(rpc)
# 观测探测
add_subdirectory(probe_detect)
# 观测模块
add_subdirectory(probe)
# 备份测试
add_subdirectory(backup_test)
# 备份模块
add_subdirectory(backup)
# 数据库模块
add_subdirectory(database)

# 将模块打包为可执行文件
add_executable(${TARGET}
    main.cpp
)

# 将相关库引入到app目标中
target_link_libraries(${TARGET}
    PRIVATE
        gperftools::tcmalloc # 内存(池)分配器
        #        Boost::system Boost::regex # boost异步网络库
        #        PcapPlusPlus::Pcap++ # 静态库
        Threads::Threads    # 多线程
        #        uring # 异步I/O库
        #        openssl::ssl
        #        openssl::crypto
#        asio2   # 网络框架
#        OpenSSL::SSL    # ssl/tls协议
#        OpenSSL::Crypto # 加密算法
#        libssh2::libssh2_static # ssh协议远程连接库
#        go::telnet # ssh和telnet通信
#        libmysqlclient.so   # mysql连接库
#        OpenSSL::SSL    # ssl/tls协议
#        OpenSSL::Crypto # 加密算法
#        libpq.so
#        libsybdb.so
#        hiredis::hiredis # redis连接库
#        bson::bson
#        mongoc::mongoc
        ${PROJECT_NAME}::logger  # 日志框架
        ${PROJECT_NAME}::sys_config  # 系统配置
        ${PROJECT_NAME}::database # 数据库

        ${PROJECT_NAME}::probe # 网络探测
        ${PROJECT_NAME}::backup # 网络探测
        ${PROJECT_NAME}::rpc # 远程调用
)

# 给模块增加预编译头文件
target_precompile_headers(${TARGET}
    PUBLIC
        ${PROJECT_INCLUDE_DIR}/pre_compiled.h
)

# 指定需要安装的文件
install(
    TARGETS ${TARGET}
    RUNTIME DESTINATION /usr/local/bin     # 可执行文件安装路径
#    ARCHIVE DESTINATION /usr/local/lib/network_prober    # 静态库文件安装路径（.a/.lib） |
#    LIBRARY DESTINATION /usr/local/lib/network_prober    # 动态库文件安装路径(.so/.dll) | 通常，编译器只会在 </usr/lib> 和 </lib> 中找头文件，如果
)

# 将服务文件拷贝到/usr/lib/systemd/system目录下
install(
    FILES "${CMAKE_CURRENT_SOURCE_DIR}/network_prober.service"
    DESTINATION "/usr/lib/systemd/system"
    #    PERMISSIONS GROUP_READ
    COMPONENT etc
)

##---------------- 以下为用CPack打包成deb包的内容 ----------------##
include(ConfigCPack)
